
#include <iostream>
#include <functional>

/*
代码展示了如何在C++中使用回调机制，特别是在需要将成员函数作为回调的场景下。
*/


/*
你的代码展示了如何在不同上下文中使用 std::function<void()> 和函数指针 void (*)(void)。你也指出了 std::function<void()> 类型无法直接转换回 void (*)(void) 类型。
为了实现你的目标，你可以使用一些间接的方法将 std::function<void()> 转换为 void (*)(void)。
在你的代码中，你已经展示了如何使用静态成员函数来实现不同实例间的回调。以下是对你的代码的一些补充和改进：
在Motor类中添加静态函数指针 来存储 std::function<void()> 转换成的 void (*)(void) 指针。
添加一个包装函数，用于调用存储在静态函数指针中的回调。
*/

/*
解释
Motor 类:

static_function: 一个静态的 std::function<void()> 变量，用来存储绑定的成员函数。
static_callback: 一个静态的包装函数，调用存储在 static_function 中的实际函数。
在构造函数中:

使用 std::function 包装成员函数 callback，并将其分配给 static_function。
通过 attach_Callback 方法将 static_callback 作为参数传递。
在 main 函数中:

测试回调函数的正确性。
通过这种方式，你可以在需要时通过静态包装函数调用实例的成员函数。这个方法避免了直接转换 std::function 和函数指针类型的问题。
*/

/*
你的代码展示了如何在 C++ 中使用类内的静态成员函数和静态成员变量来解决回调函数的问题。
特别是，你使用 std::function 存储成员函数回调，并通过静态成员函数来间接调用它。这是一种有效的方法来绕过普通函数指针和成员函数指针之间的不兼容性。
*/

typedef void (*CallbackFunction)(void);

void attach(CallbackFunction callback)
{
  callback();
}

class Timer{
  public:
    void attach_stdfunction(std::function<void()> callback)
    {
      callback();
    }
    void attach_Callback(CallbackFunction callback)//等同于 void attach(void (*callback)(void) )
    {
      callback();
    }
};

//继承，包含都可以
class Motor{
  public:
    Motor(int _pin):pin(_pin){
      std::cout << "Motor init pin: "<<pin << std::endl;
      timer.attach_stdfunction((std::function<void()>)std::bind(&Motor::callback, this));
      
      //attach_Callback(static_callback);//编译报错
      // 使用静态成员函数来包装非静态成员函数
      static_function = std::bind(&Motor::callback, this);
      timer.attach_Callback(static_callback);
      attach(static_callback);
    }
    void callback(void)
    {
      std::cout << "callback pin: "<<pin<< std::endl;
    }
     // 静态包装函数
    static void static_callback()
    {
      if (static_function)
      {
        static_function();
      }
    }
  private:
    int pin;
    Timer timer;
    // 静态 std::function 存储回调
    static std::function<void()> static_function;
};

// 静态成员变量定义
std::function<void()> Motor::static_function = nullptr;

Motor motor_r(1),motor_l(2);


//typedef void (*CallbackFunction)(void);类型可以转化成std::function<void()>类型，但是std::function<void()>类型无法转化回去
int main() 
{
  std::cout << "main" << std::endl;
}
